const http=require('http');//服务模块
const fs = require('fs');//读取文件的模块
const io = require('socket.io');//传数据模块
const mysql = require('mysql');//数据库模块

const regs = require('regs');//这个引错了

const url = require('url')//解析地址的模块

//mysql服务
let db = mysql.createPool({host:'localhost',port:3306,username:'root',password:'',database:'20181210'});



//http服务
let	httpServer=http.createServer((request,response)=>{
	let {pathname,query} = url.parse(req.url,true)
		fs.readFile(pathname,(err,data)=>{
			if(err){
				response.writeHeader(404);
				response.write('not found');
			}
			else{
				response.write(data);
			}
			response.end();
		})
	});
	httpServer.listen(8080);
//websoket服务器
let asock= [];//存储发言的数组,自带的，，可以不加
let wsServer= io.listen(httpServer);

wsServer.on('connection',function(sock){
		let cur_username='';//记录当前登录的用户
		let cur_userID=0; //记录登录的id
		asock.push(sock); //把用户存起来，可以判断在线人数

		//注册
	sock.on('reg',(user,pass)=>{
		//1。校验数据
		if(!regs.username.test(user)){
			sock.emit('reg_ret',1,'用户名不符合规则');	
		}else if(!regs.password.test(pass)){
			sock.emit('reg_ret',1,'密码不符合规则')
		}else{//2。校验名字，密码
			db.query(`SELECT ID FROM user_data WHERE username='${user}'`,(err,data)=>{
				if(err){
					sock.emit('reg_ret',1,'数据库有问题')
				}else if(data.length>0){
					sock.emit('reg_ret',1,'用户名被占用了')
				}else{//3.插入
					db.query(`INSERT INTO user_data (username,password,online) VALUES('$(user)','$(pass)',0')`,err=>{
						if(err){
							sock.emit('reg_ret',1,'数据库有问题')
						}else{
							sock.emit('reg_ret',0,'注册成功')
						}
					})
				}
			})
		}
	})
		//登录
	sock.on('login',(user,pass)=>{
		//1。校验数据
		if(!regs.username.test(user)){
			sock.emit('login_ret',1,'用户名不符合规范')
		}else if(!regs.password.test(pass)){
			sock.emit('login_ret',1,'密码不符合规范')
		}else{
			db.query(`SELECT ID,password FROM user_data WHERE username='${user}'`,(err,data)=>{
				if(err){//2。判断用户存在
					sock.emit('login_ret',1,'数据库有错')
				}else if(data.length==0){
					sock.emit('login_ret',1,'用户名不存在')
				}else if(data[0].password!=pass){
					sock.emit('login_ret',1,'用户名与密码不匹配')
				}else{//3.改变在线状态，tocken等工具
					db.query(`UPDATA user_data SET online=1 WHERE ID=${data[0].ID}`,err=>{
						if(err){
							sock.emit('login_ret',1,'数据库有错')
						}else{
							sock.emit('login_ret',0,'登陆成功')
							cur_username =user;
							cur_userID = data[0].ID;
						}
					})
				}
			})
		}	
	})
		//发言
	sock.on('msg',txt=>{
		if(!txt){
			sock.emit('msg_ret',1,'消息文本不能为空')
		}else{//广播给所有人
			asock.forEach(item=>{
				if(item==sock) return;//除了自己的其他人接受消息
				item.emit('msg',cur_username,txt);//发到前台
			});	

			sock.emit('msg_ret',0,'发送成功');
		}
	});
		//离线
	sock.on('disconnect',function(){
		db.query(`UPDATE user_data SET online=0 WHERE ID=${cur_userID}`,err=>{
			if(err){
				console.log('数据库有错',err);
			}else{
				cur_userID = 0;
				cur_username='';


				asoke=asock.filter(item=>item!=sock);//删除离线的人
			}
		})
	});
})